/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package xsystems.propagationModel;

import java.util.ArrayList;

/**
 *
 * @author Karine
 */
public class FreeSpaceModel extends PropagationModel {

    private String nomeMetodo;
    private double distTotal;
    private double frequency;
    private boolean calculePot_Recebida = false;
    private float Pt;
    private float Gt;
    private float Gr;
    private float L;
    private int numberPoints;
    private ArrayList<Point> Points_FreeSpaceModel;

    
    //pathloss
    public FreeSpaceModel(String nomeMetodo, int distTotal, double frequency, int numberPoints) {

        super(nomeMetodo);
        this.calculePot_Recebida = false;
        this.nomeMetodo = nomeMetodo; //Nome do Método
        this.distTotal = distTotal; //Distância Total percorrida
        this.frequency = frequency;
        this.numberPoints = numberPoints; // Número de pontos considerados nas medições
        Points_FreeSpaceModel = new ArrayList<>();
    }

    
    // Received Power
    public FreeSpaceModel(String nomeMetodo, int distTotal, float Pt, float Gt, float Gr, double frequency, float L, int numberPoints) {

        super(nomeMetodo);
        this.calculePot_Recebida = true;
        this.distTotal = distTotal;
        this.nomeMetodo = nomeMetodo; //Nome do Método
        this.frequency = frequency;
        this.Pt = Pt;
        this.Gt = Gt;
        this.Gr = Gr;
        this.L = L;
        this.numberPoints = numberPoints; // Número de pontos considerados nas medições
        Points_FreeSpaceModel = new ArrayList<>();
    }

    // Método que calcula atenuação do sinal ao longo da distância
    public ArrayList<Point> getPathLoss() {

        double c = 3 * Math.pow(10, 8);// comprimento da onda da antena
        double lambda = c / frequency;

        double[] attenuation = new double[numberPoints + 1]; //Cria um vetor para armazenar o valor encontrado de atenuação em cada ponto
        double rate = distTotal / numberPoints; //rate é a lagura de um intervalo ou a razão  

        for (int i = 1; i < numberPoints + 1; i++) {
            double positionReceiver = i * rate; // retorna a posição do receptor em um dado instante
            //Calculo da atenuação em um ponto específico:
            attenuation[i] = (double) ((-10) * Math.log10(Math.pow(lambda / (4 * Math.PI * (positionReceiver)), 2)));
            // perda = (-10)*log((lambda/(4*pi*(distancia(k)*1000)))^2);           

            // Criando um objeto do tipo ponto e adiciona na lista de Pontos:
            Point ponto = new Point(positionReceiver, attenuation[i]);
            Points_FreeSpaceModel.add(ponto);
        }
        return Points_FreeSpaceModel;
    }

    // Método que calcula a potência recebida do sinal ao longo da distância
    public ArrayList<Point> getReceivedPower() {
       // double c = 3 * Math.pow(10, 8);// comprimento da onda da antena
        double c = 300000000;
        double lambda = c / frequency;
        double lambdaQuadrado = Math.pow(lambda, 2);

        double[] Pr = new double[numberPoints + 1]; //Cria um vetor para armazenar o valor encontrado de atenuação em cada ponto
        double rate = distTotal / numberPoints; //rate é a lagura de um intervalo ou a razão  

        //desconsidera o ponto i = 0
        for (int i = 1; i < numberPoints + 1; i++) {
            double positionReceiver = i * rate; // retorna a posição do receptor em um dado instante
            //Calculo da potência em um ponto específico:
            Pr[i] = (double) (10*Math.log10(((Pt * Gt * Gr * lambdaQuadrado) / (Math.pow(4 * Math.PI, 2) * Math.pow(positionReceiver, 2) * L))));
            //Pr = 10*log10((Pt*Gt*Gr*lambda^2)/((4*pi)^2*((distancia(k))^2)*L));
                   

            // Criando um objeto do tipo ponto e adiciona na lista de Pontos:
            Point ponto = new Point(positionReceiver, Pr[i]);
           // System.out.println(positionReceiver + " " + Pr[i]);
            Points_FreeSpaceModel.add(ponto);
        }
        return Points_FreeSpaceModel;
    }

    @Override
    public ArrayList<Point> getPoints() {
        if (calculePot_Recebida == true) {
            return getReceivedPower();
        } else {
            return getPathLoss();
        }
    }

    /*@Override
     public ArrayList<Point> getPoints() {

     return getPathLoss();

     }*/
}
